﻿Imports PTIC_GestionBDD
Imports System.Data
Imports System.Data.OleDb
Imports System.Collections

Module Fonc_BDD

    'Remplissage d'une dataTable à partir d'une table SAS ou ACCESS
    Public Function recup_Table(ByVal nomFichier As Cla_NomFichier, Optional ByVal nomTable As String = "") As DataTable

        Dim conn As New OleDb.OleDbConnection
        Dim strQuery As String = ""
        Dim ds As DataSet = New DataSet

        If nomTable = "" Then nomTable = nomFichier.nomSansExt

        If nomFichier.ext = "sas7bdat" Then
            ''''conn = SAS_initWorkspaceIOMconnection(nomFichier)
            strQuery = "SELECT * FROM mylib." & nomTable
        Else
            If nomTable = "" Then
                MsgBox("Il faut renseigner un nom de table pour récupérer une base ACCESS")
            Else
                conn = ACCESS_initOleDbConnection(nomFichier)
                strQuery = "SELECT * FROM " & nomTable
            End If
        End If

        conn.Open()
        Dim daListe As New OleDb.OleDbDataAdapter(New OleDb.OleDbCommand(strQuery, conn))
        daListe.Fill(ds, nomTable)
        conn.Close()

        Return ds.Tables(nomTable)
    End Function

    'Détermine si une colonne est présente ou non dans une dataTable
    Public Function estPresente_Column(ByVal tble As DataTable, ByVal nomColonne As String) As Boolean
        Dim result As Boolean = False
        If tble Is Nothing Then Return False
        For Each c As DataColumn In tble.Columns
            If c.ColumnName = nomColonne Then result = True
        Next
        Return result
    End Function

    Public Function rechercheVdouble(ByVal tble As DataTable, ByVal valeurCherchee As Double, _
                                     ByVal nomColRecherche As String, ByVal nomColValeur As String) As Double
        Dim result As Double
        Dim ecart_min As Double = Double.PositiveInfinity
        For Each r As DataRow In tble.Rows
            If Math.Abs(r(nomColRecherche) - valeurCherchee) < ecart_min Then
                result = r(nomColValeur)
                ecart_min = Math.Abs(r(nomColRecherche) - valeurCherchee)
            End If
        Next
        Return result
    End Function


    ''' <summary>
    ''' Permet d'effectuer un RECHERCHEV de type excel dans une dataTable
    ''' </summary>
    ''' <param name="tble">dataTable dans laquelle la recherche doit être réalisée</param>
    ''' <param name="valeurCherchee">Valeur recherchée dans la colonne nomColRecherche</param>
    ''' <param name="nomColRecherche">Nom de la colonne dans laquelle la valeur cherchée doit se trouver</param>
    ''' <param name="nomColValeur">Nom de la colonne dont la valeur est renvoyée</param>
    ''' <returns>Renvoie la valeure correspondant à la plus grande valeur inférieure à la valeur recherchée</returns>
    ''' <remarks>La table dans laquelle s'effectue la recherche doit être triée par ordre croissant sur la colonne de recherche</remarks>
    Public Function rechercheVdoubleMin(ByVal tble As DataTable, ByVal valeurCherchee As Double, _
                                 ByVal nomColRecherche As String, ByVal nomColValeur As String) As Double

        Dim i As Integer = 0
        Dim ecart_min As Double = Double.PositiveInfinity

        Do
            i = i + 1
        Loop While tble.Rows(i)(nomColRecherche) < valeurCherchee

        Return tble.Rows(i - 1)(nomColValeur)

    End Function

    Public Function schemaTableToTbString(ByVal schemaTable As DataTable) As String()
        Dim i As Integer
        Dim result(schemaTable.Rows.Count - 1) As String
        For i = 0 To schemaTable.Rows.Count - 1
            If schemaTable.Rows(i)(3).ToString() = "TABLE" Then
                result(i) = schemaTable.Rows(i)(2).ToString()
            End If
        Next i
        schemaTableToTbString = result
    End Function

    'Fonction permettant de lister toutes les tables d'une base de données
    'portée par l'objet conn de la classe OledbConnection
    'Le résultat est de type DataTable
    Public Function getTables(ByRef conn As OleDbConnection) As DataTable
        conn.Open()
        Dim schemaTable As DataTable
        schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
        conn.Close()
        getTables = schemaTable
    End Function

End Module